package code19_jdk8.stream;

import java.util.Arrays;
import java.util.Optional;
import java.util.stream.Collectors;

import org.junit.Test;

public class TestTran {

	// 给定一个整数数组，操作流获得一个由每一个数平方构成的新流，并输出该流中的元素。
	@Test
	public void t1() {
		int[] nums = {123, 456, 789, 3456, 134};
		Arrays.stream(nums)
		.map(x -> x*x)
		.forEach(System.out::println);
	}
	// 找出2011年发生的所有交易, 按交易额升序排序。
	@Test
	public void t2() {
		Transaction.getData().stream()
		.filter( t -> t.getYear() == 2011)
		.sorted( (t1, t2) -> Integer.compare(t1.getValue(), t2.getValue()) )
		.forEach(System.out::println);
	}
	
	// 输出交易员工作的城市名。
	@Test
	public void t3() {
		Transaction.getData().stream()
		.map( t -> t.getTrader().getCity() )
		.distinct()
		.forEach(System.out::println);
	}
	
	// 查询所有来自南京的交易员，按姓名降序排序。
	@Test
	public void t4() {
		Transaction.getData().stream()
		.filter( t -> "南京".equals(t.getTrader().getCity()))
		.map(Transaction::getTrader)
		.distinct()
		.sorted( (t1, t2) -> t2.getName().compareTo(t1.getName()))
		.forEach(System.out::println);
	}
	
	// 输出所有交易员的姓名，按姓名字符个数升序排序，如果个数相同，按字母顺序升序排序。
	@Test
	public void t5() {
		Transaction.getData().stream()
		.map(t -> t.getTrader().getName())
		.distinct()
		.sorted( (n1, n2) -> {
			int m = n1.length() - n2.length();
			if (0 == m) {
				return n1.compareTo(n2);
			}
			return m;
		})
		.forEach(System.out::println);
	}
	
	// 将所有交易员的姓名拼接在一起，形成一个字符串。
	@Test
	public void t6() {
		String str = Transaction.getData().stream()
		.map(t -> t.getTrader().getName())
		.distinct()
		.collect(Collectors.joining());
		System.out.println("str:" + str);
	}
	
	// 获取南京所有的交易员的交易额
	@Test
	public void t7() {
		Optional<Integer> sum = Transaction.getData().stream()
		.filter( t -> "南京".equals(t.getTrader().getCity()))
		.map(t -> t.getValue())
		.reduce(Integer::sum);
		System.out.println("sum:" + sum.get());
	}
	
	// 输出最高的交易额
	@Test
	public void t8() {
		Optional<Integer> max = Transaction.getData().stream()
		.map(Transaction::getValue)
		.max(Integer::compare);
		System.out.println("max:" + max.get());
	}
	
	// 有没有交易员在南京
	@Test
	public void t9() {
		boolean anyMatch = Transaction.getData().stream()
		.anyMatch( t -> "南京".equals(t.getTrader().getCity()) );
		System.out.println("anyMatch:" + anyMatch);
	}
	
	// 统计交易员姓名使用的字符的种类有几种
	@Test
	public void t10() {
		long count = Transaction.getData().stream()
		.flatMap( t -> {
			String[] arr = t.getTrader().getName().split("");
			return Arrays.stream(arr);
		})
		.distinct()
		.count();
		System.out.println("count:" + count);
	}

}
